{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import math, random\n",
    "\n",
    "import gym\n",
    "import numpy as np\n",
    "\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.optim as optim\n",
    "import torch.autograd as autograd \n",
    "import torch.nn.functional as F"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "from IPython.display import clear_output\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h3>Use Cuda</h3>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "USE_CUDA = torch.cuda.is_available()\n",
    "Variable = lambda *args, **kwargs: autograd.Variable(*args, **kwargs).cuda() if USE_CUDA else autograd.Variable(*args, **kwargs)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h2>Replay Buffer</h2>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [],
   "source": [
    "from collections import deque\n",
    "\n",
    "class ReplayBuffer(object):\n",
    "    def __init__(self, capacity):\n",
    "        self.buffer = deque(maxlen=capacity)\n",
    "    \n",
    "    def push(self, state, action, reward, next_state, done):\n",
    "        state      = np.expand_dims(state, 0)\n",
    "        next_state = np.expand_dims(next_state, 0)\n",
    "            \n",
    "        self.buffer.append((state, action, reward, next_state, done))\n",
    "    \n",
    "    def sample(self, batch_size):\n",
    "        state, action, reward, next_state, done = zip(*random.sample(self.buffer, batch_size))\n",
    "        return np.concatenate(state), action, reward, np.concatenate(next_state), done\n",
    "    \n",
    "    def __len__(self):\n",
    "        return len(self.buffer)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h2>Cart Pole Environment</h2>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[33mWARN: gym.spaces.Box autodetected dtype as <type 'numpy.float32'>. Please provide explicit dtype.\u001b[0m\n"
     ]
    }
   ],
   "source": [
    "env_id = \"CartPole-v0\"\n",
    "env = gym.make(env_id)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h2>Epsilon greedy exploration</h2>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "epsilon_start = 1.0\n",
    "epsilon_final = 0.01\n",
    "epsilon_decay = 500\n",
    "\n",
    "epsilon_by_frame = lambda frame_idx: epsilon_final + (epsilon_start - epsilon_final) * math.exp(-1. * frame_idx / epsilon_decay)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7fed86976690>]"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fed93204950>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot([epsilon_by_frame(i) for i in range(10000)])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h2>Dueling Deep Q Network</h2>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "class DuelingDQN(nn.Module):\n",
    "    def __init__(self, num_inputs, num_outputs):\n",
    "        super(DuelingDQN, self).__init__()\n",
    "        \n",
    "        \n",
    "        self.feature = nn.Sequential(\n",
    "            nn.Linear(num_inputs, 128),\n",
    "            nn.ReLU()\n",
    "        )\n",
    "        \n",
    "        self.advantage = nn.Sequential(\n",
    "            nn.Linear(128, 128),\n",
    "            nn.ReLU(),\n",
    "            nn.Linear(128, num_outputs)\n",
    "        )\n",
    "        \n",
    "        self.value = nn.Sequential(\n",
    "            nn.Linear(128, 128),\n",
    "            nn.ReLU(),\n",
    "            nn.Linear(128, 1)\n",
    "        )\n",
    "        \n",
    "    def forward(self, x):\n",
    "        x = self.feature(x)\n",
    "        advantage = self.advantage(x)\n",
    "        value     = self.value(x)\n",
    "        return value + advantage  - advantage.mean()\n",
    "    \n",
    "    def act(self, state, epsilon):\n",
    "        if random.random() > epsilon:\n",
    "            state   = Variable(torch.FloatTensor(state).unsqueeze(0), volatile=True)\n",
    "            q_value = self.forward(state)\n",
    "            action  = q_value.max(1)[1].data[0]\n",
    "        else:\n",
    "            action = random.randrange(env.action_space.n)\n",
    "        return action"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "current_model = DuelingDQN(env.observation_space.shape[0], env.action_space.n)\n",
    "target_model  = DuelingDQN(env.observation_space.shape[0], env.action_space.n)\n",
    "\n",
    "if USE_CUDA:\n",
    "    current_model = current_model.cuda()\n",
    "    target_model  = target_model.cuda()\n",
    "    \n",
    "optimizer = optim.Adam(current_model.parameters())\n",
    "\n",
    "replay_buffer = ReplayBuffer(1000)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h3>Synchronize current policy net and target net</h3>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "def update_target(current_model, target_model):\n",
    "    target_model.load_state_dict(current_model.state_dict())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "update_target(current_model, target_model)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h2>Computing Temporal Difference Loss</h2>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "def compute_td_loss(batch_size):\n",
    "    state, action, reward, next_state, done = replay_buffer.sample(batch_size)\n",
    "\n",
    "    state      = Variable(torch.FloatTensor(np.float32(state)))\n",
    "    next_state = Variable(torch.FloatTensor(np.float32(next_state)))\n",
    "    action     = Variable(torch.LongTensor(action))\n",
    "    reward     = Variable(torch.FloatTensor(reward))\n",
    "    done       = Variable(torch.FloatTensor(done))\n",
    "\n",
    "    q_values      = current_model(state)\n",
    "    next_q_values = target_model(next_state)\n",
    "\n",
    "    q_value          = q_values.gather(1, action.unsqueeze(1)).squeeze(1)\n",
    "    next_q_value     = next_q_values.max(1)[0]\n",
    "    expected_q_value = reward + gamma * next_q_value * (1 - done)\n",
    "    \n",
    "    loss = (q_value - expected_q_value.detach()).pow(2).mean()\n",
    "        \n",
    "    optimizer.zero_grad()\n",
    "    loss.backward()\n",
    "    optimizer.step()\n",
    "    \n",
    "    return loss"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot(frame_idx, rewards, losses):\n",
    "    clear_output(True)\n",
    "    plt.figure(figsize=(20,5))\n",
    "    plt.subplot(131)\n",
    "    plt.title('frame %s. reward: %s' % (frame_idx, np.mean(rewards[-10:])))\n",
    "    plt.plot(rewards)\n",
    "    plt.subplot(132)\n",
    "    plt.title('loss')\n",
    "    plt.plot(losses)\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h2>Training</h2>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nRt67JrWVwAAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fed4621aa10>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "num_frames = 10000\n",
    "batch_size = 32\n",
    "gamma      = 0.99\n",
    "\n",
    "losses = []\n",
    "all_rewards = []\n",
    "episode_reward = 0\n",
    "\n",
    "state = env.reset()\n",
    "for frame_idx in range(1, num_frames + 1):\n",
    "    epsilon = epsilon_by_frame(frame_idx)\n",
    "    action = current_model.act(state, epsilon)\n",
    "    \n",
    "    next_state, reward, done, _ = env.step(action)\n",
    "    replay_buffer.push(state, action, reward, next_state, done)\n",
    "    \n",
    "    state = next_state\n",
    "    episode_reward += reward\n",
    "    \n",
    "    if done:\n",
    "        state = env.reset()\n",
    "        all_rewards.append(episode_reward)\n",
    "        episode_reward = 0\n",
    "        \n",
    "    if len(replay_buffer) > batch_size:\n",
    "        loss = compute_td_loss(batch_size)\n",
    "        losses.append(loss.data[0])\n",
    "        \n",
    "    if frame_idx % 200 == 0:\n",
    "        plot(frame_idx, all_rewards, losses)\n",
    "        \n",
    "    if frame_idx % 100 == 0:\n",
    "        update_target(current_model, target_model)\n",
    "        "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<p><hr></p>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h1>Atari Environment</h1>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [],
   "source": [
    "from common.wrappers import make_atari, wrap_deepmind, wrap_pytorch"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [],
   "source": [
    "env_id = \"PongNoFrameskip-v4\"\n",
    "env    = make_atari(env_id)\n",
    "env    = wrap_deepmind(env)\n",
    "env    = wrap_pytorch(env)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [],
   "source": [
    "class DuelingCnnDQN(nn.Module):\n",
    "    def __init__(self, input_shape, num_outputs):\n",
    "        super(DuelingCnnDQN, self).__init__()\n",
    "        \n",
    "        \n",
    "        self.input_shape = input_shape\n",
    "        self.num_actions = num_outputs\n",
    "        \n",
    "        self.features = nn.Sequential(\n",
    "            nn.Conv2d(input_shape[0], 32, kernel_size=8, stride=4),\n",
    "            nn.ReLU(),\n",
    "            nn.Conv2d(32, 64, kernel_size=4, stride=2),\n",
    "            nn.ReLU(),\n",
    "            nn.Conv2d(64, 64, kernel_size=3, stride=1),\n",
    "            nn.ReLU()\n",
    "        )\n",
    "        \n",
    "        self.advantage = nn.Sequential(\n",
    "            nn.Linear(self.feature_size(), 512),\n",
    "            nn.ReLU(),\n",
    "            nn.Linear(512, num_outputs)\n",
    "        )\n",
    "        \n",
    "        self.value = nn.Sequential(\n",
    "            nn.Linear(self.feature_size(), 512),\n",
    "            nn.ReLU(),\n",
    "            nn.Linear(512, 1)\n",
    "        )\n",
    "        \n",
    "    def forward(self, x):\n",
    "        x = self.features(x)\n",
    "        x = x.view(x.size(0), -1)\n",
    "        advantage = self.advantage(x)\n",
    "        value     = self.value(x)\n",
    "        return value + advantage  - advantage.mean()\n",
    "    \n",
    "    def feature_size(self):\n",
    "        return self.features(autograd.Variable(torch.zeros(1, *self.input_shape))).view(1, -1).size(1)\n",
    "    \n",
    "    def act(self, state, epsilon):\n",
    "        if random.random() > epsilon:\n",
    "            state   = Variable(torch.FloatTensor(np.float32(state)).unsqueeze(0), volatile=True)\n",
    "            q_value = self.forward(state)\n",
    "            action  = q_value.max(1)[1].data[0]\n",
    "        else:\n",
    "            action = random.randrange(env.action_space.n)\n",
    "        return action"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [],
   "source": [
    "current_model = DuelingCnnDQN(env.observation_space.shape, env.action_space.n)\n",
    "target_model  = DuelingCnnDQN(env.observation_space.shape, env.action_space.n)\n",
    "\n",
    "if USE_CUDA:\n",
    "    current_model = current_model.cuda()\n",
    "    target_model  = target_model.cuda()\n",
    "    \n",
    "optimizer = optim.Adam(current_model.parameters(), lr=0.0001)\n",
    "\n",
    "replay_initial = 10000\n",
    "replay_buffer = ReplayBuffer(100000)\n",
    "\n",
    "update_target(current_model, target_model)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fed466049d0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "num_frames = 1000000\n",
    "batch_size = 32\n",
    "gamma      = 0.99\n",
    "\n",
    "losses = []\n",
    "all_rewards = []\n",
    "episode_reward = 0\n",
    "\n",
    "state = env.reset()\n",
    "for frame_idx in range(1, num_frames + 1):\n",
    "    epsilon = epsilon_by_frame(frame_idx)\n",
    "    action = current_model.act(state, epsilon)\n",
    "    \n",
    "    next_state, reward, done, _ = env.step(action)\n",
    "    replay_buffer.push(state, action, reward, next_state, done)\n",
    "    \n",
    "    state = next_state\n",
    "    episode_reward += reward\n",
    "    \n",
    "    if done:\n",
    "        state = env.reset()\n",
    "        all_rewards.append(episode_reward)\n",
    "        episode_reward = 0\n",
    "        \n",
    "    if len(replay_buffer) > replay_initial:\n",
    "        loss = compute_td_loss(batch_size)\n",
    "        losses.append(loss.data[0])\n",
    "        \n",
    "    if frame_idx % 10000 == 0:\n",
    "        plot(frame_idx, all_rewards, losses)\n",
    "        \n",
    "    if frame_idx % 1000 == 0:\n",
    "        update_target(current_model, target_model)\n",
    "        "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
